package com.sxt.core.provider.scan.impl;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.sxt.core.anno.ExposeService;
import com.sxt.core.anno.Inject;
import com.sxt.core.model.BeanDefine;
import com.sxt.core.provider.Regeister;
import com.sxt.core.provider.scan.ServiceExpose;
import com.sxt.core.utils.PackageScanUtil;

public class IOCPackageScan implements ServiceExpose{

	// 就是先把要注册的服务放在servers ，等ioc 启动完毕后 注册
	private final List<String> servers = new ArrayList<String>()  ;

	//
	private Regeister regiester;

	@Override
	public List<BeanDefine> scanPackage(String packages) {
		List<String> classNames = PackageScanUtil.packageScan(packages);
		List<BeanDefine> beanDefines = new ArrayList<BeanDefine>();
		for (String className : classNames) { // ExposeService
			try {
				Class<?> clazz = Class.forName(className);
				ExposeService annotation = clazz.getAnnotation(ExposeService.class);
				if(annotation!=null) {
					// 添加到注册列表里面
					addServerList(clazz,annotation);
					// 添加到ioc的对象定义对象里面
					addBeanDefines(clazz,beanDefines);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return beanDefines;
	}

	private void addServerList(Class<?> clazz, ExposeService annotation) {
		// 服务的名称（服务的id）
		String serverId = annotation.serverId();// 有时候服务的id为null
		if(!serverId.equals("")) {
			servers.add(serverId);
			return ;
		}

		Class<?>[] allInterfaces = clazz.getInterfaces();
		Class<?> interfaces = null ;
		if(allInterfaces.length>1) {
			interfaces = annotation.interfaces();
		}else {
			interfaces = allInterfaces[0];
		}
		serverId = interfaces.getName();// 使用接口的名称最好
		servers.add(serverId);
	}

	private void addBeanDefines(Class<?> clazz, List<BeanDefine> beanDefines) {
		String className = clazz.getSimpleName();
		String index = (className.charAt(0)+"").toLowerCase();
		String id =  index + className.substring(1, className.length());// CupServiceImpl->cupServiceImpl
		Field[] fields = clazz.getDeclaredFields();
		Map<String, Object> props = new HashMap<String, Object>();
		for (Field field : fields) {
			Inject inject = field.getAnnotation(Inject.class);
			if(inject!=null) {
				// inject.value() == "" type  值注入
				props.put(field.getName(), inject.value()); // value（值，）    ref(注入的对象，但是对象一般使用类型) //
			}
		}
		beanDefines.add(new BeanDefine(id, clazz.getName(), props));
	}

	@Override
	public void complateRegeister(int port) {
		if(!servers.isEmpty()) {
			for (String server : servers) {
				//				TODO 需要获取本机的ip 地址，现在无法获取到
				regiester.regeister(server, "localhost:"+port);
			}

		}

	}

	public void setRegiester(Regeister regiester) {
		this.regiester = regiester;
	}


}
